//
//  UserAccountViewModel.swift
//  Weibo
//
//  Created by 梁智 on 15/11/25.
//  Copyright © 2015年 lzfree. All rights reserved.
//

import Foundation

/// 用户账号视图模型 - 没有父类
/**
模型通常继承自 NSObject -> 可以使用 KVC 设置属性，简化对象构造
如果没有父类，所有的内容，都需要从头创建，量级更轻

视图模型的作用：封装`业务逻辑`，通常没有复杂的属性
*/

class UserAccountViewModel {
    
    /// 单例 - 解决避免重复从沙盒加载 归档 文件，提高效率，让 access_token 便于被访问到
    static let sharedUserAccount = UserAccountViewModel()
    
    /// 用户模型
    var account: UserAccount?
    
    /// 返回一个有效的 accessToken
    var accessToken: String? {
        
        if !isExpired {
            return account?.access_token
        }
        return nil
    }
    
    /// 用户登录标记
    var userLogin: Bool {
        return account?.access_token != nil && !isExpired
    }
    
    /// 用户头像 URL
    var avatarUrl: NSURL {
        return NSURL(string: account?.avatar_large ?? "")!
    }
    
    /// 归档保存的路径 - 计算型属性(类似于有返回值的函数,可以让调用的时候,语义更清晰)
    /// 如果在 OC 中,可以通过只读属性/函数的方式实现
    private var accountPath: String {
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        
        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
    
    /// 判断账户是否过期
    private var isExpired: Bool {
        
        if account?.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            return false
        }
        
        return true
    }

    /// 构造函数
    private init() {
        
        account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
        
        if isExpired {
            print("已经过期")
            account = nil
        }
        
        print(account)
        
    }
    
    
}


// MARK: - 用户账户相关的网络方法
extension UserAccountViewModel {
    
    /// 加载 token
    ///
    /// - parameter code:     授权码
    /// - parameter finished: 完成回调(是否回调)
    func loadAccessToken(code: String, finished:(isSuccess: Bool) -> ()) {
        
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            if error != nil {
                finished(isSuccess: false)
                print("出错了")
                return
            }
            
            //print(result)
            self.account = UserAccount(dict: result as! [String: AnyObject])
            //print(self.account)
            
            self.loadUserInfo(self.account!, finished: finished)
        }
    }
    
    private func loadUserInfo(account: UserAccount, finished:(isSuccess: Bool) -> ()) {
        
        NetworkTools.sharedTools.loadUserInfo(account.uid!, accessToken: account.access_token!) { (result, error) -> () in
            
            if error != nil {
                print("加载用户信息出错了")
                finished(isSuccess: false)
                return
            }
            
            // 提示：如果使用 if let / guard let 统统使用 `?`
            // 作了两个判断
            // 1. result 一定有内容
            // 2. 一定是字典
            guard let dict = result as? [String: AnyObject] else {
                print("格式错误")
                finished(isSuccess: false)
                return
            }
            
            //print("dict\(dict)")
            // 将用户信息保存
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            print("account\(account)")
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            
            finished(isSuccess: true)
        }
    }
}
